package araujoCoronelVillamayor.plantasVsZombies.appModelsArena

import araujoCoronelVillamayor.plantasVsZombies.domain.Jardin
import araujoCoronelVillamayor.plantasVsZombies.domain.JardinZen
import araujoCoronelVillamayor.plantasVsZombies.domain.FactoryPlantas
import araujoCoronelVillamayor.plantasVsZombies.domain.FactoryZombies
import araujoCoronelVillamayor.plantasVsZombies.domain.FactoryMejoras
import araujoCoronelVillamayor.plantasVsZombies.domain.Mejora
import araujoCoronelVillamayor.plantasVsZombies.domain.Fila
import araujoCoronelVillamayor.plantasVsZombies.domain.Zombie
import araujoCoronelVillamayor.plantasVsZombies.domain.Planta
import org.uqbar.commons.utils.Observable
import java.util.List
import java.util.ArrayList
import org.uqbar.commons.model.UserException
import java.io.Serializable

@Observable
class SesionAppModel implements Serializable {
	
	@Property Jardin jardin
	@Property JardinZen jardinZen
	@Property int recursos
	@Property FactoryPlantas factoryPlantas
	@Property FactoryZombies factoryZombies
	//@Property List<Zombie> tiposZombies
	@Property FactoryMejoras factoryMejoras
	@Property List<Mejora> tiposMejoras
	@Property String nombreJugador
	
	@Property Fila filaSeleccionada

	@Property Zombie zombieSeleccionado
	@Property Planta plantaSeleccionada
	@Property List<Fila> resultados

	@Property AtaqueAppModel ataqueAppModel
	@Property JardinZenAppModel jardinZenAppModel
	
	@Property Fila filaSeleccionadaRefresh
	
	new(){
		//Se tienen que generar los zombies en el mismo AtaqueAppModel,
		//para que luego las otras criaturas puedan utilizar el mismo
		//para generar los log
		ataqueAppModel = new AtaqueAppModel(this)

		jardinZenAppModel = new JardinZenAppModel(this)
		jardinZen = jardinZenAppModel.jardinZen

		jardin = new Jardin
		jardin.agregarFila(new Fila("Acuatica", jardinZen))
		jardin.agregarFila(new Fila("Acuatica", jardinZen))
		jardin.agregarFila(new Fila("Acuatica", jardinZen))
		jardin.agregarFila(new Fila("Terrestre", jardinZen))
		jardin.agregarFila(new Fila("Terrestre", jardinZen))
		jardin.agregarFila(new Fila("Terrestre", jardinZen))
		
		factoryPlantas = FactoryPlantas.getInstance
		factoryZombies = FactoryZombies.instance
		factoryMejoras = FactoryMejoras.instance

		recursos = 1000
		nombreJugador = "Juan"
		
		//Coleccion de mejoras
		tiposMejoras = new ArrayList<Mejora>
		tiposMejoras.add(factoryMejoras.crearMejoraCrystal)
		tiposMejoras.add(factoryMejoras.crearMejoraGold)
		tiposMejoras.add(factoryMejoras.crearMejoraSilver)

		//Plantas iniciales del "Jardín Zen"
		jardinZen.agregarPlanta(factoryPlantas.crearShooter())
		jardinZen.agregarPlanta(factoryPlantas.crearGirasol())
		jardinZen.agregarPlanta(factoryPlantas.crearPirana())

		
		//Plantas iniciales del Jard[in. Agregamos algunas plantas para empezar...
		jardin.agregarPlanta(factoryPlantas.crearShooter(), jardin.getFilas.get(0))
		jardin.agregarPlanta(factoryPlantas.crearShooter(), jardin.getFilas.get(0))
		jardin.agregarPlanta(factoryPlantas.crearShooter(), jardin.getFilas.get(0))
		
		jardin.agregarPlanta(factoryPlantas.crearShooter(), jardin.getFilas.get(1))
		jardin.agregarPlanta(factoryPlantas.crearShooter(), jardin.getFilas.get(1))
		
		//jardin.agregarPlanta(factoryPlantas.crearShooter(ataqueAppModel), jardin.getFilas.get(2))
		
		jardin.agregarPlanta(factoryPlantas.crearGirasol(), jardin.getFilas.get(3))
		jardin.agregarPlanta(factoryPlantas.crearPirana(), jardin.getFilas.get(3))
		jardin.agregarPlanta(factoryPlantas.crearGirasol(), jardin.getFilas.get(3))
		
		jardin.agregarPlanta(factoryPlantas.crearGirasol(), jardin.getFilas.get(4))
		jardin.agregarPlanta(factoryPlantas.crearPirana(), jardin.getFilas.get(4))
		
		jardin.agregarPlanta(factoryPlantas.crearGirasol(), jardin.getFilas.get(5))
		
	}

	def void poner(){
		//TODO instanciar con FactoryPlantas
		
		if (this.plantaSeleccionada != null){ 
			val nuevaPlanta = new Planta(plantaSeleccionada.nombre, plantaSeleccionada.ataque, plantaSeleccionada.defensa, plantaSeleccionada.tipo)
			jardin.agregarPlanta(nuevaPlanta, filaSeleccionada)
		}
		else{
			throw new UserException("No hay una planta seleccionada.")
		}
	}

	def void refresh() {
		filaSeleccionadaRefresh = this.filaSeleccionada 
		
		// WORKAROUND para que refresque la grilla en las actualizaciones
		resultados = new ArrayList<Fila>

		// FIN WORKAROUND
		resultados = jardin.getFilas()
		recursos = this.recursos
		
		filaSeleccionada = this.filaSeleccionadaRefresh
	}
	
	def agregarRecursos(int puntos) {
		recursos = recursos + puntos
	}

	def quitarRecursos(int puntos) {
		recursos = recursos - puntos
	}
	
	def filaSeleccionadaNoVacia(){
		if (filaSeleccionada.estoyVacia){
			throw new UserException("La fila está vacía...no puedes atacar a alguien indefenso, cobarde :P")
		}
		else{
			true
		}
	}
}
	
